<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="jquery.js" charset="utf-8"></script>
    <script>
		
     //1. es6中promise使用。可把异步操作改成同步执行
	/* var p=new Promise(function(resolve,reject){
		 resolve('成功了')
	 })
	 console.log(p) //Promise对象 {} 
	 p.then(re=>{
	 	 console.log(14,re);
	 }).catch(err=>{
	 	 console.log(err);
	 }) */
	 
	 
	//2.1 es7中新增 async 函数，async 是“异步”的简写， async 用于申明一个异步的 function 。await 可以认为是 async wait 的简写，await 用于等待一个异步方法执行完成。它返回一个 Promise 对象。它更简介，也可把异步执行弄成同步执行 。!!!!注意，只能在函数外使用。async内部相当于封装了promise对象
	
	  	// async function show(){
		// 	return  "Hello world!";
		// }
		
		// console.log('async返回的是promise对象',show()); //Promise对象 {} 
	    // show().then(res=>{
        //     console.log('成功结果',res);
        // })
	
	
	//2.2 除了async外，跟它搭配使用的一个叫await 。await的功能相当于代替promise中.then执行的内容。await 要的是异步执行的内容
	// !!!注意问题 ,如果有await必须有async。async要放在await最近一个函数的外面
	/*  async function show(){
			var a1= await $.ajax({url: 'data/1.json'})  //{a:7}
			console.log(38,a1) //{a: 7} {b:5} {c: 99}
            var a2= await $.ajax({url: 'data/2.json'})  //{a:7}
			console.log(a2) //{a: 7} {b:5} {c: 99}
		}
		
	show()  */
	 
	
	 //4.async，await与promise有时是相辅相成的。比如在封装后台给的不同接口地址时，就需要对ajax进行在次封装
	
	 //解决问题1-封装统一接口地址,像在次网络封装wx.request,uni.request等
   function getAjax(url2){
	 		return new Promise(function(resolve,reject){
	 			 $.ajax({
	 			 	url:url2, //接口地址
	 			 	success:function(res){
	 			 		resolve(res) //成功回调
	 			 	},
	 			 	error:function(err){
	 			 		reject(err) //失败回调
	 			 	}
	 			 })
	 			 
	 		 })	
	 		  
	 	}
/* 	async function getAsync(){
		
	    var a1= await getAjax('data/1.json')  //外面传入不同的接口路径
		
		var a2= await getAjax('data/2.json')
		
				
	    var a3= await getAjax('data/3.json')
		
		console.log(111,a1,a2,a3)	
	}
	
	getAsync() */
		
		
	 //解决问题2-ajax回调地狱问题-下次的数据，依赖上次的数据
	 //根据异步1的结果，是否执行2或者3。这样就解决了ajax层层嵌套这些回调地狱
	 /*  async function getAsync(){
	 	var a1= await getAjax('data/1.json')  //{a:7}
	
	 	if(a1){//条件不满足,不执行
	 		var a2= await getAjax('data/2.json')
			if(a2){
				console.log('a2的结果执行了')
			}
	 	}
	 	else{
	 		var a3= await getAjax('data/3.json')
			if(a3){
				console.log('a3的结果执行了')
			}
	 	}
	 	
	 }
	 
	 getAsync() */
	 
     //5.async，await的错误处理-如果请求发生异常，怎么处理？把await 放到 try 中进行执行，如有异常，就使用catch 进行处理
   //还原问题-网络请求不可控，会影响后面代码执行
 /*  async function getAsync2(){
        
              let res1=await getAjax('data/a.json')
              let res2=await getAjax('data/2.json')
              console.log(144,res1,res2)
        
             //后边有代码会影响,因为上面有错误
             console.log(147,'奎哥好帅')
     }
  getAsync2() */

  //解决问题  js原生 try{放网络请求可能出错} catch{捕获错误}
   async function getAsync1(){
        try {
          let res1=await getAjax('data/1.json')
          let res2=await getAjax('data/2.json')
          console.log(res1,res2)
          
        } catch (error) {
            console.log('捕捉错误异常，不影响后续代码执行',error.status); 
        }
         
         //后边有代码也不会影响执行
         console.log(163,'奎哥好帅');
 }
getAsync1() 

/* 
总结：async/await的优缺点
它是把异步请求变成同步执行的.async放在最近函数外调用,返回的是promise对象.
1.方便级联调用：即调用依次发生的场景；
2.同步代码编写方式： Promise使用then函数进行链式调用，一直点点点，是一种从左向右的横向写法；async/await从上到下，顺序执行，就像写同步代码一样，更符合代码编写习惯；
缺点：
没有catch错误处理，需要用js原生的try,catch进行错误处理 */
	
    </script>
  </head>
  <body>

  </body>
</html>
